/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package managers;

import beans.Barrio;
import beans.Bebida;
import beans.Boliche;
import beans.MedioComunicacion;
import beans.Musica;
import beans.Persona;
import beans.Profesion;
import beans.Socio;
import dao.BarrioDao;
import dao.BebidaDao;
import dao.BolicheDao;
import dao.MedioComunicacionDao;
import dao.MusicaDao;
import dao.PersonaDao;
import dao.ProfesionDao;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.AbstractListModel;
import javax.swing.table.AbstractTableModel;
import util.AmigosTableModel;
import util.PreferenciaListModel;

/**
 *
 * @author nMoncho
 */
public class ManagerSocios {

    private Socio socioACargar;
    //Models
    private PreferenciaListModel<Bebida> modeloBebidas;
    private PreferenciaListModel<Musica> modeloMusica;
    private PreferenciaListModel<MedioComunicacion> modeloMedios;
    private AmigosTableModel modeloAmigos;
    //Amigos a Borrar
    private List<Persona> amigosABorrar = new ArrayList<Persona>();

    public ManagerSocios(Socio socio){
        socioACargar = socio;
        modeloBebidas = new PreferenciaListModel<Bebida>(socioACargar.getPreferenciaBebida());
        modeloMusica = new PreferenciaListModel<Musica>(socioACargar.getPreferenciaMusica());
        modeloMedios = new PreferenciaListModel<MedioComunicacion>(socioACargar.getPreferenciaComunicacion());
        modeloAmigos = new AmigosTableModel(socioACargar.getAmigos());
    }

    public ManagerSocios(){
        this(new Socio());
    }

    public boolean legajoInvalidoParaBoliche(String legajo, Boliche boliche) {
        if(socioACargar.getId() == null)//si el socio a cargar es nuevo
            return PersonaDao.existeLegajoParaBoliche(legajo, boliche);
        else{
            if(socioACargar.getBoliche().equals(boliche)){//No va a cambiar de boliche
                if(socioACargar.getLegajo().compareTo(legajo) != 0)//Pero cambia de legajo
                    return PersonaDao.existeLegajoParaBoliche(socioACargar, legajo);
                else
                    return false;//No cambia nada, asi que es valido
            }else//Va a cambiar de boliche, y debo verificar si existe para ese boliche,
                //el legajo de la pantalla (haya cambiado o no)
                return PersonaDao.existeLegajoParaBoliche(legajo, boliche);
        }
            
    }

    public void setSocio(Socio socio){
        this.socioACargar = socio;
    }

    public void setCargarDatosCliente(Boliche boliche, String legajo, String razon, boolean avisarCumples,
            String nombre, String apellido, String sexo, Date fechaNacimiento, Profesion profesion,
            String direccion, Barrio barrio, String telefono, String email) {

        if(socioACargar.getBoliche() == null || !socioACargar.getBoliche().equals(boliche) )
            socioACargar.setBoliche(boliche);

        socioACargar.setLegajo(legajo);
        socioACargar.setAvisarPorCumpleagnos((avisarCumples ? "Y" : "N"));
        socioACargar.setNombre(nombre);
        socioACargar.setApellido(apellido);
        socioACargar.setSexo(sexo);
        socioACargar.setFechaNacimiento(fechaNacimiento);

        if(socioACargar.getEstudio() == null || !socioACargar.getEstudio().equals(profesion))
            socioACargar.setEstudio(profesion);

        socioACargar.setDireccion(direccion);

        if(socioACargar.getBarrio() == null || !socioACargar.getBarrio().equals(barrio))
            socioACargar.setBarrio(barrio);
        
        socioACargar.setTelefono(telefono);
        socioACargar.setMail(email);
    }


    //Metodos de ayuda para los tipos
    public List<Boliche> getBoliches(){
        return BolicheDao.getBoliches();
    }

    public List<Barrio> getBarrios(){
        return BarrioDao.getBarrios();
    }

    public List<Profesion> getProfesiones(){
        return ProfesionDao.getProfesiones();
    }

    public List<Musica> getMusica(){
        List<Musica> musica = MusicaDao.getMusica();
        List<Musica> musica0 = new ArrayList<Musica>();
        for(Musica music : musica){
            if(!socioACargar.getPreferenciaMusica().contains(music))
                musica0.add(music);
        }
        return musica0;
    }

    public List<MedioComunicacion> getMedios(){
        List<MedioComunicacion> medios = MedioComunicacionDao.getMedioComunicacion();
        List<MedioComunicacion> medios0 = new ArrayList<MedioComunicacion>();
        for(MedioComunicacion medio : medios){
            if(!socioACargar.getPreferenciaComunicacion().contains(medio))
                medios0.add(medio);
        }
        return medios0;
    }

    public List<Bebida> getBebidas(){
        List<Bebida> bebidas = BebidaDao.getBebidas();
        List<Bebida> bebidas0 = new ArrayList<Bebida>();
        for(Bebida bebida : bebidas){
            if(!socioACargar.getPreferenciaBebida().contains(bebida))
                bebidas0.add(bebida);
        }
        return bebidas0;
        
    }

    public AbstractListModel getBebidaModel(){
        return modeloBebidas;
    }

    public AbstractListModel getMusicaModel(){
        return modeloMusica;
    }

    public AbstractListModel getMediosModel(){
        return modeloMedios;
    }

    public AbstractTableModel getAmigosModel(){
        return modeloAmigos;
    }

    public void agregarAmigo(String nombre, String apellido, String telefono, Date fechaNacimiento) {
        Persona amigo = new Persona();
        amigo.setNombre(nombre);
        amigo.setApellido(apellido);
        amigo.setTelefono(telefono);
        amigo.setFechaNacimiento(fechaNacimiento);
        socioACargar.getAmigos().add(amigo);
    }

    public void quitarAmigo(int row) {
        Persona amigo = socioACargar.getAmigos().get(row);
        socioACargar.getAmigos().remove(amigo);
        
        if(amigo.getId() != null)//Existe en base de datos??
            amigosABorrar.add(amigo);
    }

    public boolean guardarSocio(){
        return PersonaDao.saveOrUpdateAndDelete(socioACargar, amigosABorrar);
    }
}
